#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //获取可用串口名到下拉栏
    QList<QSerialPortInfo> list = QSerialPortInfo::availablePorts();
    for(int i=0; i<list.size(); i++)
    {
        ui->comboBox_port->addItem(list.at(i).portName());
    }
    //创建串口对象
    serial = new QSerialPort;
    //连接信号与槽（接收数据）
    QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_Button_openserial_clicked()//点击打开串口按钮
{
    if(ui->Button_openserial->text() == "打开串口")
    {
        //设置串口为下拉栏所选串口名
        serial->setPortName(ui->comboBox_port->currentText());
        //设置波特率
        switch (ui->comboBox_baud->currentIndex())
        {
        case 0: serial->setBaudRate(QSerialPort::Baud115200); break;//115200
        //case 0: serial->setBaudRate(QSerialPort::Baud2000000); break;//115200
        case 1: serial->setBaudRate(QSerialPort::Baud9600);   break;
        default: break;
        }
        //设置数据位数
        switch (ui->comboBox_databit->currentIndex())
        {
        case 0:serial->setDataBits(QSerialPort::Data8); break;//1位
        case 1:serial->setDataBits(QSerialPort::Data6); break;
        default: break;
        }
        //设置校验位
        switch (ui->comboBox_parity->currentIndex())
        {
        case 0:serial->setParity(QSerialPort::NoParity);   break;//无校验位
        case 1:serial->setParity(QSerialPort::EvenParity); break;
        case 2:serial->setParity(QSerialPort::OddParity);  break;
        default: break;
        }
        //设置停止位
        switch (ui->comboBox_stopbit->currentIndex())
        {
        case 0:serial->setStopBits(QSerialPort::OneStop); break;//1位
        case 1:serial->setStopBits(QSerialPort::OneAndHalfStop); break;
        case 2:serial->setStopBits(QSerialPort::TwoStop); break;
        default: break;
        }
        //设置流控制
        serial->setFlowControl(QSerialPort::NoFlowControl);//无流控制
        //打开串口 同时判断是否成功
        bool info = serial->open(QIODevice::ReadWrite);
        if(info == true)
        {
            qDebug()<<"success";
            //改变label颜色（指示灯)
            ui->label_light->setStyleSheet("background-color:rgb(0,255,0);border-radius:5px;");
            //关闭下拉栏设置使能
            ui->comboBox_port->setEnabled(false);
            ui->comboBox_baud->setEnabled(false);
            ui->comboBox_databit->setEnabled(false);
            ui->comboBox_parity->setEnabled(false);
            ui->comboBox_stopbit->setEnabled(false);
            //改变按钮文本为“关闭串口”
            ui->Button_openserial->setText(tr("关闭串口"));
        }
        else
        {
            qDebug()<<"fail";
        }
    }
    else
    {   //关闭串口
        serial->clear();
        serial->close();
        //改变label颜色（指示灯)
        ui->label_light->setStyleSheet("background-color:rgb(255,0,0);border-radius:5px;");
        //恢复下拉栏设置使能
        ui->comboBox_port->setEnabled(true);
        ui->comboBox_baud->setEnabled(true);
        ui->comboBox_databit->setEnabled(true);
        ui->comboBox_parity->setEnabled(true);
        ui->comboBox_stopbit->setEnabled(true);
        //改变按钮文本为“打开串口”
        ui->Button_openserial->setText(tr("打开串口"));
    }
}

void MainWindow::ReadData()//读取接收到的信息
{
    QByteArray buf = serial->readAll();
    if(ui->checkBox->isChecked()==true)//已经被勾选
    {
        QString hexData= buf.toHex().toUpper();//将数据转换为16进制字符串并大写
        QString spacedData;//用于存储每个字节隔开一个空格的字符串
        for(int i=0;i<hexData.length();i+=2)//在每个字节后添加一个空格
        {
            spacedData += hexData.mid(i,2);
            spacedData += " ";
        }
        ui->textBrowser->append(spacedData);//将转换后的数据显示
    }
    else
    {
        ui->textBrowser->append(buf);//未勾选则直接显示
    }
}

void MainWindow::on_Button_send_clicked()//点击发送按钮
{
    //检查串口是否打开
    if (serial->isOpen())
    {
        if(ui->checkBox_2->isChecked()==true)//16进制发送被选中
        {
            //获取要发送的数据：lineEdit_send内容
            QString sendData = ui->lineEdit_send->text();
            //将字符串转换为QByteArray形式（调用了hexStringToByteArray函数）
            QByteArray data  = hexStringToByteArray(sendData);
            //发送数据
            serial->write(data);
        }
        else
        {
            //获取要发送的数据：lineEdit_send内容
            QString sendData = ui->lineEdit_send->text();
            //将字符串转为QByteArray
            QByteArray data  = sendData.toUtf8();
            //发送数据
            serial->write(data);
        }
    }
    else { qDebug()<<"serial is not open"; }
}
